﻿// Pseudoprime numbers POJ - 3641.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <math.h>

using namespace std;


//https://vjudge.csgrandeur.cn/problem/POJ-3641

/*
在寒假的学习中，我们学习了数论相关知识，费马定理指出，对于任意的素数 p 和任意的整数 a > 1，满足 a^p = a (mod p) 。
然而，并不一定满足这个条件的都是素数。我们称p是基于a的伪素数当且仅当p不是素数，但是满足a^p=a(mod p)。

给定 2 < p ≤ 1000000000 且 1 < a < p ，判断 p 是否为以 a 为底的伪素数。

输入
输入包含多个测试用例，以 "0 0" 表示输入结束。每个测试用例，由包含 p 和 a 的一行组成。

输出
对于每个测试用例，如果 p 是以 a 为底的伪素数，则输出 "yes"，否则输出 "no" 。

示例输入
3 2
10 3
341 2
341 3
1105 2
1105 3
0 0
示例输出
no
no
yes
no
yes
yes
*/

int p,a;

bool checkp(int p) {
	int limit = sqrt(p) + 1;

	for (int i = 2; i <= limit; i++) {
		if (p % i == 0) return false;
	}

	return true;
}


int quickmi(int a, int b, int M) {
	long long ans = 1;
	while (b) {
		if (b & 1) {
			ans = ans * a % M;
		}
		b >>= 1;
		a = 1LL*a * a % M;
	}

	return ans;
}

void solve() {
	if (checkp(p) == false && quickmi(a, p, p) == a) {
		cout << "yes" << endl;
	}
	else {
		cout << "no" << endl;
	}


}


int main()
{
	while (cin >> p >> a) {
		if (a == 0 || p == 0) break;
		solve();
	}


	return 0;
}
 